1 Test 1 : utilisation des algorithmes de Déformation Temporelle Dynamique

J’ai ici appliqué les algorithmes Dynamic Time Warping (DTW) qui permettent de calculer des distances entre deux séries temporelles qui n’ont pas la même longueur. Je pense que ça ne s’adapte pas vraiment dans noter cas mais je voulais tester. L’idée de cet algorithme est de regarder les similarités entre les séries temporelles en prenant en compte les éventuels décalages temporels (i.e. : \(X_t\) et \(X_{t-1}\) représente la même série, juste décalée dans le temps, non pris en compte par distance euclidienne) et les différences de longueur (deux coureurs qui courent de la même façon mais pas à la même vitesse). En plus ça n’a pas trop l’air de marcher puisqu’il faut que les deux séries soient de même longueur j’ai l’impression

modeles <- ts(read.csv("../../data_bis/modeles.csv", sep=";")[,-1],
              start = 2011,frequency = 12)
data <- readRDS("../../data_bis/donnes_cam.RDS")
indices_mensuels_baseline <- read.csv("../../data_bis/indices_mensuels_baseline.csv",
                                      sep=";")[,-c(1:2)]
indices_mensuels_baseline <- ts(indices_mensuels_baseline, start = 2011, frequency = 12)
modeles <- ts.union(modeles,indices_mensuels_baseline)
colnames(modeles) <- gsub(".*\\.", "", colnames(modeles))

data[,"Indicateur synthétique"] <- scale(data[,"Indicateur synthétique"] )
data_lag <- lag(data, -1)

library(dtw)
distance <- do.call(rbind, lapply(1:ncol(modeles), function(i){
  dtw_b <- dtw((modeles[,i]),
      window(data[,"ind_synt_brut"], start = start(modeles), end = end(modeles)),
      keep=TRUE, window.size = 2)
  dtw_cvs <- dtw((modeles[,i]),
                 window(data[,"Indicateur synthétique"], start = start(modeles), end = end(modeles)),
                 keep=TRUE, window.size = 2)
  res <- data.frame(dtw_b$distance, dtw_b$normalizedDistance,
             dtw_cvs$distance, dtw_cvs$normalizedDistance,
             row.names = colnames(modeles)[i])
  colnames(res) <- c("D. ind_brut", "D. norm. ind_brut",
                     "D. ind_cvs", "D. norm. ind_cvs")
  res
}
))
round(distance, 3)
##                   D. ind_brut D. norm. ind_brut D. ind_cvs D. norm. ind_cvs
## reg_log_rmsw_z        140.312             0.731    143.147            0.746
## reg_log_rmsw_lf       133.438             0.695    137.471            0.716
## reg_log_nrmsw_z       140.727             0.733    143.380            0.747
## reg_log_nrmsw_lf      146.605             0.764    148.401            0.773
## reg_prob_rmsw_z       133.097             0.693    137.739            0.717
## reg_prob_rmsw_lf      133.438             0.695    137.471            0.716
## reg_prob_nrmsw_z      134.697             0.702    138.657            0.722
## reg_prob_nrmsw_lf     135.791             0.707    138.997            0.724
## git                   142.063             0.740    143.427            0.747
## sncf                  140.165             0.730    142.007            0.740
distance_diff <- do.call(rbind, lapply(1:ncol(modeles), function(i){
  dtw_b <- dtw(diff(modeles[,i]),
      diff(window(data[,"ind_synt_brut"], 
             start = start(modeles), end = end(modeles))),
      keep=TRUE, window.size = 2)
  dtw_cvs <- dtw(diff(modeles[,i]),
                 diff(window(data[,"Indicateur synthétique"],
                        start = start(modeles), end = end(modeles))),
                 keep=TRUE, window.size = 2)
  res <- data.frame(dtw_b$distance, dtw_b$normalizedDistance,
             dtw_cvs$distance, dtw_cvs$normalizedDistance,
             row.names = colnames(modeles)[i])
  colnames(res) <-  c("D. ind_brut", "D. norm. ind_brut",
                     "D. ind_cvs", "D. norm. ind_cvs")
  res
}
))
round(distance_diff, 3)
##                   D. ind_brut D. norm. ind_brut D. ind_cvs D. norm. ind_cvs
## reg_log_rmsw_z         17.164             0.090     15.161             0.08
## reg_log_rmsw_lf        17.118             0.090     15.133             0.08
## reg_log_nrmsw_z        17.141             0.090     15.131             0.08
## reg_log_nrmsw_lf       17.097             0.090     15.156             0.08
## reg_prob_rmsw_z        17.121             0.090     15.135             0.08
## reg_prob_rmsw_lf       17.118             0.090     15.133             0.08
## reg_prob_nrmsw_z       17.084             0.090     15.171             0.08
## reg_prob_nrmsw_lf      17.079             0.090     15.153             0.08
## git                    17.304             0.091     15.247             0.08
## sncf                   17.263             0.091     15.239             0.08

Et si on renormalise :

distance_norm <- do.call(rbind, lapply(1:ncol(modeles), function(i){
  dtw_b <- dtw(scale(modeles[,i]),
      scale(window(data[,"ind_synt_brut"], 
             start = start(modeles), end = end(modeles))),
      keep=TRUE, window.size = 2)
  dtw_cvs <- dtw(scale(modeles[,i]),
                 scale(window(data[,"Indicateur synthétique"],
                        start = start(modeles), end = end(modeles))),
                 keep=TRUE, window.size = 2)
  res <- data.frame(dtw_b$distance, dtw_b$normalizedDistance,
             dtw_cvs$distance, dtw_cvs$normalizedDistance,
             row.names = colnames(modeles)[i])
  colnames(res) <-  c("D. ind_brut", "D. norm. ind_brut",
                     "D. ind_cvs", "D. norm. ind_cvs")
  res
}
))
round(distance_norm, 3)
##                   D. ind_brut D. norm. ind_brut D. ind_cvs D. norm. ind_cvs
## reg_log_rmsw_z        102.125             0.532    102.962            0.536
## reg_log_rmsw_lf       102.644             0.535    104.262            0.543
## reg_log_nrmsw_z       105.473             0.549    103.460            0.539
## reg_log_nrmsw_lf      103.478             0.539    101.525            0.529
## reg_prob_rmsw_z       104.829             0.546    106.196            0.553
## reg_prob_rmsw_lf      102.644             0.535    104.262            0.543
## reg_prob_nrmsw_z      105.012             0.547    103.193            0.537
## reg_prob_nrmsw_lf     102.825             0.536    101.471            0.528
## git                   102.267             0.533    103.099            0.537
## sncf                   87.050             0.453     89.609            0.467
distance_norm_diff <- do.call(rbind, lapply(1:ncol(modeles), function(i){
  dtw_b <- dtw(scale(modeles[,i]),
      scale(window(data[,"ind_synt_brut"], 
             start = start(modeles), end = end(modeles))),
      keep=TRUE, window.size = 2)
  dtw_cvs <- dtw(scale(modeles[,i]),
                 scale(window(data[,"Indicateur synthétique"],
                        start = start(modeles), end = end(modeles))),
                 keep=TRUE, window.size = 2)
  res <- data.frame(dtw_b$distance, dtw_b$normalizedDistance,
             dtw_cvs$distance, dtw_cvs$normalizedDistance,
             row.names = colnames(modeles)[i])
  colnames(res) <-  c("D. ind_brut", "D. norm. ind_brut",
                     "D. ind_cvs", "D. norm. ind_cvs")
  res
}
))
round(distance_norm_diff, 3)
##                   D. ind_brut D. norm. ind_brut D. ind_cvs D. norm. ind_cvs
## reg_log_rmsw_z        102.125             0.532    102.962            0.536
## reg_log_rmsw_lf       102.644             0.535    104.262            0.543
## reg_log_nrmsw_z       105.473             0.549    103.460            0.539
## reg_log_nrmsw_lf      103.478             0.539    101.525            0.529
## reg_prob_rmsw_z       104.829             0.546    106.196            0.553
## reg_prob_rmsw_lf      102.644             0.535    104.262            0.543
## reg_prob_nrmsw_z      105.012             0.547    103.193            0.537
## reg_prob_nrmsw_lf     102.825             0.536    101.471            0.528
## git                   102.267             0.533    103.099            0.537
## sncf                   87.050             0.453     89.609            0.467

Pour rappel, on retient l’indicateur reg_log_nrmsw_lf.

ind_retenu <- "reg_log_nrmsw_lf"

Notre indicateur n’est pas forcément celui qui minimise la distance mais toutes les distances sont proches : on voit en fait que tous les indicateurs sont proches, sauf la baseline SNCF.

Voir : http://dtw.r-forge.r-project.org

https://en.wikipedia.org/wiki/Dynamic_time_warping

https://towardsdatascience.com/dynamic-time-warping-3933f25fcdd

1.1 Sur séries CVS

distance <- do.call(rbind, lapply(1:ncol(modeles), function(i){
  
  dtw_b <- dtw(get_indicators(jx13(modeles[,i]),"sa")[[1]],
      window(data[,"ind_synt_brut"], start = start(modeles), end = end(modeles)),
      keep=TRUE, window.size = 2)
  dtw_cvs <- dtw(get_indicators(jx13(modeles[,i]),"sa")[[1]],
                 window(data[,"Indicateur synthétique"], start = start(modeles), end = end(modeles)),
                 keep=TRUE, window.size = 2)
  res <- data.frame(dtw_b$distance, dtw_b$normalizedDistance,
             dtw_cvs$distance, dtw_cvs$normalizedDistance,
             row.names = colnames(modeles)[i])
  colnames(res) <- c("D. ind_brut", "D. norm. ind_brut",
                     "D. ind_cvs", "D. norm. ind_cvs")
  res
}
))
round(distance, 3)
##                   D. ind_brut D. norm. ind_brut D. ind_cvs D. norm. ind_cvs
## reg_log_rmsw_z        140.201             0.730    143.044            0.745
## reg_log_rmsw_lf       133.433             0.695    137.466            0.716
## reg_log_nrmsw_z       140.932             0.734    143.594            0.748
## reg_log_nrmsw_lf      146.696             0.764    148.538            0.774
## reg_prob_rmsw_z       133.043             0.693    137.699            0.717
## reg_prob_rmsw_lf      133.433             0.695    137.466            0.716
## reg_prob_nrmsw_z      134.850             0.702    138.799            0.723
## reg_prob_nrmsw_lf     135.924             0.708    139.174            0.725
## git                   142.433             0.742    143.840            0.749
## sncf                  140.352             0.731    142.176            0.741
distance_diff <- do.call(rbind, lapply(1:ncol(modeles), function(i){
  dtw_b <- dtw(diff(get_indicators(jx13(modeles[,i]),"sa")[[1]]),
      diff(window(data[,"ind_synt_brut"], 
             start = start(modeles), end = end(modeles))),
      keep=TRUE, window.size = 2)
  dtw_cvs <- dtw(diff(get_indicators(jx13(modeles[,i]),"sa")[[1]]),
                 diff(window(data[,"Indicateur synthétique"],
                        start = start(modeles), end = end(modeles))),
                 keep=TRUE, window.size = 2)
  res <- data.frame(dtw_b$distance, dtw_b$normalizedDistance,
             dtw_cvs$distance, dtw_cvs$normalizedDistance,
             row.names = colnames(modeles)[i])
  colnames(res) <-  c("D. ind_brut", "D. norm. ind_brut",
                     "D. ind_cvs", "D. norm. ind_cvs")
  res
}
))
round(distance_diff, 3)
##                   D. ind_brut D. norm. ind_brut D. ind_cvs D. norm. ind_cvs
## reg_log_rmsw_z         17.187             0.090     15.169             0.08
## reg_log_rmsw_lf        17.146             0.090     15.115             0.08
## reg_log_nrmsw_z        17.237             0.091     15.157             0.08
## reg_log_nrmsw_lf       17.225             0.091     15.184             0.08
## reg_prob_rmsw_z        17.141             0.090     15.109             0.08
## reg_prob_rmsw_lf       17.146             0.090     15.115             0.08
## reg_prob_nrmsw_z       17.141             0.090     15.183             0.08
## reg_prob_nrmsw_lf      17.150             0.090     15.150             0.08
## git                    17.159             0.090     15.165             0.08
## sncf                   17.248             0.091     15.205             0.08

Et si on renormalise :

distance_norm <- do.call(rbind, lapply(1:ncol(modeles), function(i){
  dtw_b <- dtw(scale(get_indicators(jx13(modeles[,i]),"sa")[[1]]),
      scale(window(data[,"ind_synt_brut"], 
             start = start(modeles), end = end(modeles))),
      keep=TRUE, window.size = 2)
  dtw_cvs <- dtw(scale(get_indicators(jx13(modeles[,i]),"sa")[[1]]),
                 scale(window(data[,"Indicateur synthétique"],
                        start = start(modeles), end = end(modeles))),
                 keep=TRUE, window.size = 2)
  res <- data.frame(dtw_b$distance, dtw_b$normalizedDistance,
             dtw_cvs$distance, dtw_cvs$normalizedDistance,
             row.names = colnames(modeles)[i])
  colnames(res) <-  c("D. ind_brut", "D. norm. ind_brut",
                     "D. ind_cvs", "D. norm. ind_cvs")
  res
}
))
round(distance_norm, 3)
##                   D. ind_brut D. norm. ind_brut D. ind_cvs D. norm. ind_cvs
## reg_log_rmsw_z        108.163             0.563    109.199            0.569
## reg_log_rmsw_lf       107.822             0.562    109.577            0.571
## reg_log_nrmsw_z       103.098             0.537    103.096            0.537
## reg_log_nrmsw_lf      107.204             0.558    105.456            0.549
## reg_prob_rmsw_z       105.304             0.548    105.781            0.551
## reg_prob_rmsw_lf      107.822             0.562    109.577            0.571
## reg_prob_nrmsw_z      102.934             0.536    101.873            0.531
## reg_prob_nrmsw_lf     103.940             0.541    103.089            0.537
## git                   104.753             0.546    105.697            0.551
## sncf                   90.620             0.472     98.811            0.515
distance_norm_diff <- do.call(rbind, lapply(1:ncol(modeles), function(i){
  dtw_b <- dtw(scale(get_indicators(jx13(modeles[,i]),"sa")[[1]]),
      scale(window(data[,"ind_synt_brut"], 
             start = start(modeles), end = end(modeles))),
      keep=TRUE, window.size = 2)
  dtw_cvs <- dtw(scale(get_indicators(jx13(modeles[,i]),"sa")[[1]]),
                 scale(window(data[,"Indicateur synthétique"],
                        start = start(modeles), end = end(modeles))),
                 keep=TRUE, window.size = 2)
  res <- data.frame(dtw_b$distance, dtw_b$normalizedDistance,
             dtw_cvs$distance, dtw_cvs$normalizedDistance,
             row.names = colnames(modeles)[i])
  colnames(res) <-  c("D. ind_brut", "D. norm. ind_brut",
                     "D. ind_cvs", "D. norm. ind_cvs")
  res
}
))
round(distance_norm_diff, 3)
##                   D. ind_brut D. norm. ind_brut D. ind_cvs D. norm. ind_cvs
## reg_log_rmsw_z        108.163             0.563    109.199            0.569
## reg_log_rmsw_lf       107.822             0.562    109.577            0.571
## reg_log_nrmsw_z       103.098             0.537    103.096            0.537
## reg_log_nrmsw_lf      107.204             0.558    105.456            0.549
## reg_prob_rmsw_z       105.304             0.548    105.781            0.551
## reg_prob_rmsw_lf      107.822             0.562    109.577            0.571
## reg_prob_nrmsw_z      102.934             0.536    101.873            0.531
## reg_prob_nrmsw_lf     103.940             0.541    103.089            0.537
## git                   104.753             0.546    105.697            0.551
## sncf                   90.620             0.472     98.811            0.515

2 Test 2 : renormaliser or not renormaliser ? That is the question

Quand on regarde nos indicateurs de sentiment bruts, il est clair qu’il y a des différences en niveau. Ce qui est étonnant c’est que pour la majorité des indicateurs on a toujours des tweets qui sont globalement positifs (ici c’est bien entre -1 et 1).

AQLTools::hc_stocks(2*(modeles)-1,digits = 2)

En revanche quand on renormalise toutes les séries sont extrêmement proches, on retrouve ce qu’on a vu dans la partie précédente. Je trouve que ça milite pour renormaliser les séries : la moyenne et l’écart-type de l’indicateur Camme n’a pas de sens (série calculée à partir des soldes d’opinion renormalisés, on force l’indicateur à être de moyenne 100 et d’écart-type 10) et nos différents modèles représentent les mêmes phénomènes économiques. Si vous préférez on peut toujours faire une moyenne de 100 et d’écart-type 10 pour tout.

AQLTools::hc_stocks(scale(modeles),digits = 2)

La baseline de la sncf est quand même à part

3 Test 3 : saisonnalité et JO

Quand on parle d’effets jours-ouvrables on distingue trois type d’effet :

  • un effet longueur de mois (les mois n’ont pas la même longueur)

  • un effet type de jour : les ventes sont généralement plus importantes le samedi que le lundi. Pour simplifier le modèle on considère parfois parfois un effet jour de la semaine vs week-end (sous entendu un lundi a le même effet qu’un mardi… jusqu’à vendredi mais pas le même effet qu’un samedi, qui a le même effet qu’un dimanche et qu’un jour ferié) : c’est ce qu’on appelle working days. Dans le cas où on distingue tous les jours de la semaine on parle de trading days.

  • un effet “fêtes mobiles”, souvent ce qu’on appel un effet “graduel de Pâques”. En fait Pâques ne tombe pas le même jour chaque année et Pâques a un effet certain sur la vente de chocolat. En revanche les achats de chocolat ne se font pas le jour de mais les jours avant : c’est l’effet graduel. En fonction du jour de Pâques cet effet graduel peut être sur deux mois. Pour les autres fêtes comme Noël cet effet graduel est pris en compte dans la saisonnalité

Dans notre cas on n’aura pas d’effet longueur de mois, sûrement pas d’effet fête mobile mais on peut avoir un effet type de jour.

On pourrait avoir un effet saisonnier : les tweets sont plus négatifs en hiver qu’en été. Pour tester la saisonnalité on peut faire plusieurs tests (voir https://jdemetradocumentation.github.io/JDemetra-documentation/pages/theory/Tests.html).

serie <- modeles[,ind_retenu]
serie <- ts(scale(serie),
            start = start(serie),
            frequency = 12)
jd2_seasonality_Friedman(serie) # test s'il y a une saisonnalité stable
## [1] 25.602451839  0.007433692
## attr(,"description")
## [1] "Chi2 with 11 degrees of freedom "
jd2_seasonality_KruskalWallis(serie) # pas de saisonnalité
## [1] 5.3987597 0.9103291
## attr(,"description")
## [1] "Chi2 with 11 degrees of freedom "
jd2_seasonality_FTest(serie) # présence de saisonnalité
## [1] 3.061297450 0.001767486
## attr(,"description")
## [1] "F with 11 degrees of freedom in the nominator and 82 degrees of freedom in the denominator"
jd2_seasonality_QSTest(serie) # pas de saisonnalité
## [1] 4.83971151 0.08893444
## attr(,"description")
## [1] "Chi2 with 2 degrees of freedom "

Ici les résultats sont mitigés :

  • le test de Friedman nous dit que si il y a une saisonnalité alors il y a une saisonnalité stable. S’il n’y a pas de saisonnalité alors ce test va conclure à une saisonnalité stable (tout le temps égal à 0)

  • Kruskal-Wallis et QS concluent à pas de saisonnalité

  • le Ftest conclue à une saisonnalité : de manière schématique, pour ce test on fait une régression en ajoutant une indicatrice pour chaque mois et on teste si l’ensemble des coefficients sont nuls.

Cependant plusieurs indicateurs nous semblent indiquer qu’il n’y a pas de saisonnalité marquée. Tout d’abord quand on trace les séries par mois on ne voit pas de d’évolution différente entre les mois.

AQLTools::graph_ts(serie,
                   diviserParPeriode = TRUE,
                   n_ylabel = 4, y_lab = NULL)

Quand on fait une désaisonnalisation, le modèle ARIMA qui est retenu est \(ARIMA(0,1,1)(0,0,0)\) avec aucun ordre saisonnier :

mod <- x13(serie)
mod$regarima
## y = regression model + arima (0, 1, 1, 0, 0, 0)
## Log-transformation: no
## Coefficients:
##          Estimate Std. Error
## Theta(1)   -0.495       0.09
## 
## 
## Residual standard error: 0.3424 on 93 degrees of freedom
## Log likelihood = -33.11, aic = 70.22 aicc = 70.35, bic(corrected for length) = -2.096

Par ailleurs, même si il y a une saisonnalité identifiable, c’est la composante saisonnière qui contribue le moins à la variance de la série.

mod$diagnostics$combined_test
## Non parametric tests for stable seasonality
##                                                          P.value
##   Kruskall-Wallis test                                      0.001
##   Test for the presence of seasonality assuming stability   0.000
##   Evolutive seasonality test                                0.422
## 
## Identifiable seasonality probably present
mod$diagnostics$variance_decomposition
##            Component
## Cycle      79.342875
## Seasonal    6.243428
## Irregular  16.139834
## TD & Hol.   0.000000
## Others      0.000000
## Total     101.726137

Si on trace les coefficients saisonniers par mois, même si on voit des différences c’est très faible et il y a beaucoup de bruit.

plot(mod$decomposition)

On n’observe pas d’effet jours ouvrables (on n’observe pas de régresseur), que ce soit en trading days :

spec <- x13_spec("RSA5c",
                 easter.enabled = FALSE,
                 tradingdays.leapyear = "None")
mod <- x13(serie, spec = spec)
mod$regarima
## y = regression model + arima (0, 1, 1, 0, 0, 0)
## Log-transformation: no
## Coefficients:
##          Estimate Std. Error
## Theta(1)   -0.495       0.09
## 
## 
## Residual standard error: 0.3424 on 93 degrees of freedom
## Log likelihood = -33.11, aic = 70.22 aicc = 70.35, bic(corrected for length) = -2.096

Qu’en working days :

spec <- x13_spec("RSA4c",
                 easter.enabled = FALSE,
                 tradingdays.leapyear = "None")
mod <- x13(serie, spec = spec)
mod$regarima
## y = regression model + arima (0, 1, 1, 0, 0, 0)
## Log-transformation: no
## Coefficients:
##          Estimate Std. Error
## Theta(1)   -0.495       0.09
## 
## 
## Residual standard error: 0.3424 on 93 degrees of freedom
## Log likelihood = -33.11, aic = 70.22 aicc = 70.35, bic(corrected for length) = -2.096

Bilan : pas d’effet JO, éventuellement une saisonnalité mais je ne suis pas convaincu.

Sur l’enquête Camme on voit aussi qu’il y a très peu de différences entre l’indicateur brut et CVS :

AQLTools::hc_stocks(scale(data[,1:2]),digits = 2)

4 Etude des corrélations

4.1 En niveau ou en différence

donnes_calcul <- scale(ts.intersect(modeles[,c(ind_retenu, "git", "sncf")], data))
donnes_calcul_lag <- scale(ts.intersect(modeles[,c(ind_retenu, "git", "sncf")], data_lag))
colnames(donnes_calcul) <- 
    colnames(donnes_calcul_lag) <- 
    c("Ind_sent","Baseline_git","Baseline_sncf", "ind_synt_brut", "ind_synt_cvs",
      "niv_vie_pas", "niv_vie_fut",
      "chom_evol","oppor_achat", "epargne_actuelle",
      "sit_fin_pas", "sit_fin_fut","cap_fut"
    )
dataGraph <- ts.intersect(modeles[,c(ind_retenu, "git", "sncf")], data[,1:2], data_lag[,1:2])
colnames(dataGraph) <- c("Indicateur sentiment",
                         "Baseline Git", "Baseline SNCF", 
                         "Camme_Brut", "Camme_CVS",
                         "Camme_Brut retardé", "Camme_CVS retardé")
AQLTools::hc_stocks(scale(dataGraph),digits = 2)

On va plutôt étudier l’indicateur retardé. Il y a une tendance dans les deux séries : quand on regarde les corrélations il y a donc une corrélation falacieuse (on trouve une corrélation significative). La présence d’une racine unitaire est confirmée par le test de Philips-Perron et le test KPSS :

y <- get_indicators(jx13(donnes_calcul_lag[,"Ind_sent"]),"sa")[[1]]
PP.test(y)
## 
##  Phillips-Perron Unit Root Test
## 
## data:  y
## Dickey-Fuller = -2.0347, Truncation lag parameter = 3, p-value = 0.5621
tseries::kpss.test(y)
## 
##  KPSS Test for Level Stationarity
## 
## data:  y
## KPSS Level = 1.4884, Truncation lag parameter = 3, p-value = 0.01
PP.test(diff(y,1))
## 
##  Phillips-Perron Unit Root Test
## 
## data:  diff(y, 1)
## Dickey-Fuller = -17.164, Truncation lag parameter = 3, p-value = 0.01
tseries::kpss.test(diff(y,1))
## 
##  KPSS Test for Level Stationarity
## 
## data:  diff(y, 1)
## KPSS Level = 0.22577, Truncation lag parameter = 3, p-value = 0.1
PP.test(donnes_calcul_lag[,"ind_synt_brut"])
## 
##  Phillips-Perron Unit Root Test
## 
## data:  donnes_calcul_lag[, "ind_synt_brut"]
## Dickey-Fuller = -2.2432, Truncation lag parameter = 3, p-value = 0.4759
tseries::kpss.test(donnes_calcul_lag[,"ind_synt_brut"])
## 
##  KPSS Test for Level Stationarity
## 
## data:  donnes_calcul_lag[, "ind_synt_brut"]
## KPSS Level = 1.8588, Truncation lag parameter = 3, p-value = 0.01
PP.test(diff(donnes_calcul_lag[,"ind_synt_brut"],1))
## 
##  Phillips-Perron Unit Root Test
## 
## data:  diff(donnes_calcul_lag[, "ind_synt_brut"], 1)
## Dickey-Fuller = -8.6109, Truncation lag parameter = 3, p-value = 0.01
tseries::kpss.test(diff(donnes_calcul_lag[,"ind_synt_brut"],1))
## 
##  KPSS Test for Level Stationarity
## 
## data:  diff(donnes_calcul_lag[, "ind_synt_brut"], 1)
## KPSS Level = 0.11681, Truncation lag parameter = 3, p-value = 0.1
PP.test(donnes_calcul_lag[,"ind_synt_cvs"])
## 
##  Phillips-Perron Unit Root Test
## 
## data:  donnes_calcul_lag[, "ind_synt_cvs"]
## Dickey-Fuller = -2.2125, Truncation lag parameter = 3, p-value = 0.4886
tseries::kpss.test(donnes_calcul_lag[,"ind_synt_cvs"])
## 
##  KPSS Test for Level Stationarity
## 
## data:  donnes_calcul_lag[, "ind_synt_cvs"]
## KPSS Level = 1.888, Truncation lag parameter = 3, p-value = 0.01
PP.test(diff(donnes_calcul_lag[,"ind_synt_cvs"],1))
## 
##  Phillips-Perron Unit Root Test
## 
## data:  diff(donnes_calcul_lag[, "ind_synt_cvs"], 1)
## Dickey-Fuller = -9.4443, Truncation lag parameter = 3, p-value = 0.01
tseries::kpss.test(diff(donnes_calcul_lag[,"ind_synt_cvs"],1))
## 
##  KPSS Test for Level Stationarity
## 
## data:  diff(donnes_calcul_lag[, "ind_synt_cvs"], 1)
## KPSS Level = 0.13961, Truncation lag parameter = 3, p-value = 0.1

Il y a donc présence d’une tendance stochastique. On peut faire un test de cointégration pour voir si les séries partagent la même tendance stochastique : ce n’est pas le cas.

aTSA::coint.test(y, donnes_calcul_lag[,"ind_synt_brut"],d = 0)
## Response: y 
## Input: donnes_calcul_lag[, "ind_synt_brut"] 
## Number of inputs: 1 
## Model: y ~ X + 1 
## ------------------------------- 
## Engle-Granger Cointegration Test 
## alternative: cointegrated 
## 
## Type 1: no trend 
##     lag      EG p.value 
##    3.00   -2.17    0.10 
## ----- 
##  Type 2: linear trend 
##     lag      EG p.value 
##    3.00   -1.19    0.10 
## ----- 
##  Type 3: quadratic trend 
##     lag      EG p.value 
##   3.000  -0.753   0.100 
## ----------- 
## Note: p.value = 0.01 means p.value <= 0.01 
##     : p.value = 0.10 means p.value >= 0.10
aTSA::coint.test(y, donnes_calcul_lag[,"ind_synt_cvs"],d = 0)
## Response: y 
## Input: donnes_calcul_lag[, "ind_synt_cvs"] 
## Number of inputs: 1 
## Model: y ~ X + 1 
## ------------------------------- 
## Engle-Granger Cointegration Test 
## alternative: cointegrated 
## 
## Type 1: no trend 
##     lag      EG p.value 
##    3.00   -2.22    0.10 
## ----- 
##  Type 2: linear trend 
##     lag      EG p.value 
##    3.00   -1.14    0.10 
## ----- 
##  Type 3: quadratic trend 
##     lag      EG p.value 
##   3.000  -0.835   0.100 
## ----------- 
## Note: p.value = 0.01 means p.value <= 0.01 
##     : p.value = 0.10 means p.value >= 0.10

Il n’y a aucune des deux séries qui Granger Cause, je pense qu’il faut uniquement regarder le test en différence mais je laisse en niveau quand même pour info. En comparant à l’indicateur Camme CVS pas de causalité au sens de Granger

library(lmtest)
y <- get_indicators(jx13(donnes_calcul[, "Ind_sent"]),"sa")[[1]]
grangertest(y, donnes_calcul[, "ind_synt_cvs"], order = 1)
## Granger causality test
## 
## Model 1: donnes_calcul[, "ind_synt_cvs"] ~ Lags(donnes_calcul[, "ind_synt_cvs"], 1:1) + Lags(y, 1:1)
## Model 2: donnes_calcul[, "ind_synt_cvs"] ~ Lags(donnes_calcul[, "ind_synt_cvs"], 1:1)
##   Res.Df Df      F Pr(>F)
## 1     92                 
## 2     93 -1 0.8497 0.3591
grangertest(donnes_calcul[, "ind_synt_cvs"], y, order = 1)
## Granger causality test
## 
## Model 1: y ~ Lags(y, 1:1) + Lags(donnes_calcul[, "ind_synt_cvs"], 1:1)
## Model 2: y ~ Lags(y, 1:1)
##   Res.Df Df     F Pr(>F)
## 1     92                
## 2     93 -1 5e-04 0.9824
grangertest(diff(y), diff(donnes_calcul[, "ind_synt_cvs"]), order = 1)
## Granger causality test
## 
## Model 1: diff(donnes_calcul[, "ind_synt_cvs"]) ~ Lags(diff(donnes_calcul[, "ind_synt_cvs"]), 1:1) + Lags(diff(y), 1:1)
## Model 2: diff(donnes_calcul[, "ind_synt_cvs"]) ~ Lags(diff(donnes_calcul[, "ind_synt_cvs"]), 1:1)
##   Res.Df Df      F  Pr(>F)  
## 1     91                    
## 2     92 -1 5.4207 0.02212 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
grangertest(diff(donnes_calcul[, "ind_synt_cvs"]), diff(y), order = 1)
## Granger causality test
## 
## Model 1: diff(y) ~ Lags(diff(y), 1:1) + Lags(diff(donnes_calcul[, "ind_synt_cvs"]), 1:1)
## Model 2: diff(y) ~ Lags(diff(y), 1:1)
##   Res.Df Df     F Pr(>F)
## 1     91                
## 2     92 -1 2.599 0.1104

En comparant à l’indicateur Camme brut, on observe une causalité à 5 % : note indicateur cause instannément au sens de Granger l’indicateur Brut de l’enquête Camme (non retardé).

grangertest(y, donnes_calcul[, "ind_synt_brut"], order = 1)
## Granger causality test
## 
## Model 1: donnes_calcul[, "ind_synt_brut"] ~ Lags(donnes_calcul[, "ind_synt_brut"], 1:1) + Lags(y, 1:1)
## Model 2: donnes_calcul[, "ind_synt_brut"] ~ Lags(donnes_calcul[, "ind_synt_brut"], 1:1)
##   Res.Df Df      F Pr(>F)
## 1     92                 
## 2     93 -1 0.4843 0.4882
grangertest(donnes_calcul[, "ind_synt_brut"], y, order = 1)
## Granger causality test
## 
## Model 1: y ~ Lags(y, 1:1) + Lags(donnes_calcul[, "ind_synt_brut"], 1:1)
## Model 2: y ~ Lags(y, 1:1)
##   Res.Df Df      F Pr(>F)
## 1     92                 
## 2     93 -1 0.0133 0.9083
grangertest(diff(y), diff(donnes_calcul[, "ind_synt_brut"]), order = 1)
## Granger causality test
## 
## Model 1: diff(donnes_calcul[, "ind_synt_brut"]) ~ Lags(diff(donnes_calcul[, "ind_synt_brut"]), 1:1) + Lags(diff(y), 1:1)
## Model 2: diff(donnes_calcul[, "ind_synt_brut"]) ~ Lags(diff(donnes_calcul[, "ind_synt_brut"]), 1:1)
##   Res.Df Df      F  Pr(>F)  
## 1     91                    
## 2     92 -1 6.8778 0.01023 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
grangertest(diff(donnes_calcul[, "ind_synt_brut"]), diff(y), order = 1)
## Granger causality test
## 
## Model 1: diff(y) ~ Lags(diff(y), 1:1) + Lags(diff(donnes_calcul[, "ind_synt_brut"]), 1:1)
## Model 2: diff(y) ~ Lags(diff(y), 1:1)
##   Res.Df Df      F Pr(>F)
## 1     91                 
## 2     92 -1 2.2769 0.1348

Quand on prend l’indicateur Camme retardé, on trouve que l’indicateur Camme brut granger cause notre indicateur au seuil de 10 %.

grangertest(diff(donnes_calcul_lag[, "ind_synt_brut"]), diff(get_indicators(jx13(donnes_calcul_lag[, "Ind_sent"]),"sa")[[1]]), order = 1)
## Granger causality test
## 
## Model 1: diff(get_indicators(jx13(donnes_calcul_lag[, "Ind_sent"]), "sa")[[1]]) ~ Lags(diff(get_indicators(jx13(donnes_calcul_lag[, "Ind_sent"]), "sa")[[1]]), 1:1) + Lags(diff(donnes_calcul_lag[, "ind_synt_brut"]), 1:1)
## Model 2: diff(get_indicators(jx13(donnes_calcul_lag[, "Ind_sent"]), "sa")[[1]]) ~ Lags(diff(get_indicators(jx13(donnes_calcul_lag[, "Ind_sent"]), "sa")[[1]]), 1:1)
##   Res.Df Df      F Pr(>F)
## 1     91                 
## 2     92 -1 1.7617 0.1877

Bilan notre indicateur de sentiment permettrait de prévoir l’enquête Camme.

Quand on regarde les séries en différence on ne remarque… rien. On ne comprend pas pourquoi les baselines semblent plus proches selon les corrélations (voir plus bas).

AQLTools::hc_stocks(diff(donnes_calcul_lag[,1:5]),digits = 2)

4.1.1 Test sur baseline git

Pas de causalité au sens de Granger :

y <- get_indicators(jx13(donnes_calcul[, "Baseline_git"]),"sa")[[1]]
grangertest(diff(y), diff(donnes_calcul[, "ind_synt_cvs"]), order = 1)
## Granger causality test
## 
## Model 1: diff(donnes_calcul[, "ind_synt_cvs"]) ~ Lags(diff(donnes_calcul[, "ind_synt_cvs"]), 1:1) + Lags(diff(y), 1:1)
## Model 2: diff(donnes_calcul[, "ind_synt_cvs"]) ~ Lags(diff(donnes_calcul[, "ind_synt_cvs"]), 1:1)
##   Res.Df Df      F Pr(>F)
## 1     91                 
## 2     92 -1 0.5319 0.4677
grangertest(diff(donnes_calcul[, "ind_synt_cvs"]), diff(y), order = 1)
## Granger causality test
## 
## Model 1: diff(y) ~ Lags(diff(y), 1:1) + Lags(diff(donnes_calcul[, "ind_synt_cvs"]), 1:1)
## Model 2: diff(y) ~ Lags(diff(y), 1:1)
##   Res.Df Df      F Pr(>F)
## 1     91                 
## 2     92 -1 2.0215 0.1585
grangertest(diff(y), diff(donnes_calcul[, "ind_synt_brut"]), order = 1)
## Granger causality test
## 
## Model 1: diff(donnes_calcul[, "ind_synt_brut"]) ~ Lags(diff(donnes_calcul[, "ind_synt_brut"]), 1:1) + Lags(diff(y), 1:1)
## Model 2: diff(donnes_calcul[, "ind_synt_brut"]) ~ Lags(diff(donnes_calcul[, "ind_synt_brut"]), 1:1)
##   Res.Df Df      F Pr(>F)
## 1     91                 
## 2     92 -1 0.3959 0.5308
grangertest(diff(donnes_calcul[, "ind_synt_brut"]), diff(y), order = 1)
## Granger causality test
## 
## Model 1: diff(y) ~ Lags(diff(y), 1:1) + Lags(diff(donnes_calcul[, "ind_synt_brut"]), 1:1)
## Model 2: diff(y) ~ Lags(diff(y), 1:1)
##   Res.Df Df      F Pr(>F)
## 1     91                 
## 2     92 -1 1.8831 0.1734

Ni de cointégration :

aTSA::coint.test(donnes_calcul_lag[,"Baseline_git"], donnes_calcul_lag[,"ind_synt_brut"],d = 0)
## Response: donnes_calcul_lag[, "Baseline_git"] 
## Input: donnes_calcul_lag[, "ind_synt_brut"] 
## Number of inputs: 1 
## Model: y ~ X + 1 
## ------------------------------- 
## Engle-Granger Cointegration Test 
## alternative: cointegrated 
## 
## Type 1: no trend 
##     lag      EG p.value 
##    3.00   -2.12    0.10 
## ----- 
##  Type 2: linear trend 
##     lag      EG p.value 
##   3.000  -0.853   0.100 
## ----- 
##  Type 3: quadratic trend 
##     lag      EG p.value 
##    3.00   -1.02    0.10 
## ----------- 
## Note: p.value = 0.01 means p.value <= 0.01 
##     : p.value = 0.10 means p.value >= 0.10
aTSA::coint.test(donnes_calcul_lag[,"Baseline_git"], donnes_calcul_lag[,"ind_synt_cvs"],d = 0)
## Response: donnes_calcul_lag[, "Baseline_git"] 
## Input: donnes_calcul_lag[, "ind_synt_cvs"] 
## Number of inputs: 1 
## Model: y ~ X + 1 
## ------------------------------- 
## Engle-Granger Cointegration Test 
## alternative: cointegrated 
## 
## Type 1: no trend 
##     lag      EG p.value 
##    3.00   -2.16    0.10 
## ----- 
##  Type 2: linear trend 
##     lag      EG p.value 
##   3.000  -0.802   0.100 
## ----- 
##  Type 3: quadratic trend 
##     lag      EG p.value 
##     3.0    -1.1     0.1 
## ----------- 
## Note: p.value = 0.01 means p.value <= 0.01 
##     : p.value = 0.10 means p.value >= 0.10

4.1.2 Test sur baseline sncf

Pas de causalité au sens de Granger :

y <- get_indicators(jx13(donnes_calcul[, "Baseline_sncf"]),"sa")[[1]]
grangertest(diff(y), diff(donnes_calcul[, "ind_synt_cvs"]), order = 1)
## Granger causality test
## 
## Model 1: diff(donnes_calcul[, "ind_synt_cvs"]) ~ Lags(diff(donnes_calcul[, "ind_synt_cvs"]), 1:1) + Lags(diff(y), 1:1)
## Model 2: diff(donnes_calcul[, "ind_synt_cvs"]) ~ Lags(diff(donnes_calcul[, "ind_synt_cvs"]), 1:1)
##   Res.Df Df      F Pr(>F)
## 1     91                 
## 2     92 -1 0.2438 0.6227
grangertest(diff(donnes_calcul[, "ind_synt_cvs"]), diff(y), order = 1)
## Granger causality test
## 
## Model 1: diff(y) ~ Lags(diff(y), 1:1) + Lags(diff(donnes_calcul[, "ind_synt_cvs"]), 1:1)
## Model 2: diff(y) ~ Lags(diff(y), 1:1)
##   Res.Df Df      F Pr(>F)
## 1     91                 
## 2     92 -1 0.0058 0.9396
grangertest(diff(y), diff(donnes_calcul[, "ind_synt_brut"]), order = 1)
## Granger causality test
## 
## Model 1: diff(donnes_calcul[, "ind_synt_brut"]) ~ Lags(diff(donnes_calcul[, "ind_synt_brut"]), 1:1) + Lags(diff(y), 1:1)
## Model 2: diff(donnes_calcul[, "ind_synt_brut"]) ~ Lags(diff(donnes_calcul[, "ind_synt_brut"]), 1:1)
##   Res.Df Df     F Pr(>F)
## 1     91                
## 2     92 -1 0.306 0.5815
grangertest(diff(donnes_calcul[, "ind_synt_brut"]), diff(y), order = 1)
## Granger causality test
## 
## Model 1: diff(y) ~ Lags(diff(y), 1:1) + Lags(diff(donnes_calcul[, "ind_synt_brut"]), 1:1)
## Model 2: diff(y) ~ Lags(diff(y), 1:1)
##   Res.Df Df      F Pr(>F)
## 1     91                 
## 2     92 -1 0.0022  0.963

Ni de cointégration :

aTSA::coint.test(donnes_calcul_lag[,"Baseline_sncf"], donnes_calcul_lag[,"ind_synt_brut"],d = 0)
## Response: donnes_calcul_lag[, "Baseline_sncf"] 
## Input: donnes_calcul_lag[, "ind_synt_brut"] 
## Number of inputs: 1 
## Model: y ~ X + 1 
## ------------------------------- 
## Engle-Granger Cointegration Test 
## alternative: cointegrated 
## 
## Type 1: no trend 
##     lag      EG p.value 
##     3.0    -2.2     0.1 
## ----- 
##  Type 2: linear trend 
##     lag      EG p.value 
##    3.00   -1.32    0.10 
## ----- 
##  Type 3: quadratic trend 
##     lag      EG p.value 
##   3.000   0.769   0.100 
## ----------- 
## Note: p.value = 0.01 means p.value <= 0.01 
##     : p.value = 0.10 means p.value >= 0.10
aTSA::coint.test(donnes_calcul_lag[,"Baseline_sncf"], donnes_calcul_lag[,"ind_synt_cvs"],d = 0)
## Response: donnes_calcul_lag[, "Baseline_sncf"] 
## Input: donnes_calcul_lag[, "ind_synt_cvs"] 
## Number of inputs: 1 
## Model: y ~ X + 1 
## ------------------------------- 
## Engle-Granger Cointegration Test 
## alternative: cointegrated 
## 
## Type 1: no trend 
##     lag      EG p.value 
##    3.00   -2.19    0.10 
## ----- 
##  Type 2: linear trend 
##     lag      EG p.value 
##    3.00   -1.28    0.10 
## ----- 
##  Type 3: quadratic trend 
##     lag      EG p.value 
##   3.000   0.716   0.100 
## ----------- 
## Note: p.value = 0.01 means p.value <= 0.01 
##     : p.value = 0.10 means p.value >= 0.10

4.2 Etude des corrélations

Spoiler alert aucune corrélation significative. Pas de différence quand on regarde les séries retardées.

4.2.1 Pearson

library(corrplot)
library(Hmisc)
M <- rcorr(diff(donnes_calcul), type = "pearson")
M_lag <- rcorr(diff(donnes_calcul), type = "pearson")

Les p-values des corrélation avec notre indicateur de sentiment

table_pval <- cbind(M$P[, "Ind_sent"],
                    M_lag$P[, "Ind_sent"],
                    M$P[, "Baseline_git"],
                    M_lag$P[, "Baseline_git"],
                    M$P[, "Baseline_sncf"],
                    M_lag$P[, "Baseline_sncf"])
colnames(table_pval) <- c("Ind_sent", "Ind_sent_avance",
                          "Baseline_git", "Baseline_git_avance",
                          "Baseline_sncf", "Baseline_sncf_avance")
round(table_pval,3)
##                  Ind_sent Ind_sent_avance Baseline_git Baseline_git_avance
## Ind_sent               NA              NA        0.000               0.000
## Baseline_git        0.000           0.000           NA                  NA
## Baseline_sncf       0.439           0.439        0.064               0.064
## ind_synt_brut       0.767           0.767        0.654               0.654
## ind_synt_cvs        0.424           0.424        0.400               0.400
## niv_vie_pas         0.149           0.149        0.701               0.701
## niv_vie_fut         0.179           0.179        0.202               0.202
## chom_evol           0.861           0.861        0.891               0.891
## oppor_achat         0.059           0.059        0.129               0.129
## epargne_actuelle    0.279           0.279        0.512               0.512
## sit_fin_pas         0.280           0.280        0.927               0.927
## sit_fin_fut         0.836           0.836        0.685               0.685
## cap_fut             0.968           0.968        0.189               0.189
##                  Baseline_sncf Baseline_sncf_avance
## Ind_sent                 0.439                0.439
## Baseline_git             0.064                0.064
## Baseline_sncf               NA                   NA
## ind_synt_brut            0.168                0.168
## ind_synt_cvs             0.079                0.079
## niv_vie_pas              0.585                0.585
## niv_vie_fut              0.001                0.001
## chom_evol                0.010                0.010
## oppor_achat              0.027                0.027
## epargne_actuelle         0.234                0.234
## sit_fin_pas              0.905                0.905
## sit_fin_fut              0.107                0.107
## cap_fut                  0.040                0.040

Série sans retard :

corrplot(M$r, method = "number")

corrplot(M$r, method = "ellipse")

Séries retardées :

corrplot(M_lag$r, method = "number")

corrplot(M_lag$r, method = "ellipse")

4.2.2 Spearman

M <- rcorr(diff(donnes_calcul), type = "spearman")
M_lag <- rcorr(diff(donnes_calcul), type = "spearman")

Les p-values des corrélation avec notre indicateur de sentiment

table_pval <- cbind(M$P[, "Ind_sent"],
                    M_lag$P[, "Ind_sent"],
                    M$P[, "Baseline_git"],
                    M_lag$P[, "Baseline_git"],
                    M$P[, "Baseline_sncf"],
                    M_lag$P[, "Baseline_sncf"])
colnames(table_pval) <- c("Ind_sent", "Ind_sent_avance",
                          "Baseline_git", "Baseline_git_avance",
                          "Baseline_sncf", "Baseline_sncf_avance")
round(table_pval,3)
##                  Ind_sent Ind_sent_avance Baseline_git Baseline_git_avance
## Ind_sent               NA              NA        0.000               0.000
## Baseline_git        0.000           0.000           NA                  NA
## Baseline_sncf       0.000           0.000        0.000               0.000
## ind_synt_brut       0.001           0.001        0.000               0.000
## ind_synt_cvs        0.001           0.001        0.000               0.000
## niv_vie_pas         0.000           0.000        0.000               0.000
## niv_vie_fut         0.001           0.001        0.000               0.000
## chom_evol           0.100           0.100        0.088               0.088
## oppor_achat         0.004           0.004        0.000               0.000
## epargne_actuelle    0.000           0.000        0.003               0.003
## sit_fin_pas         0.141           0.141        0.043               0.043
## sit_fin_fut         0.000           0.000        0.000               0.000
## cap_fut             0.006           0.006        0.020               0.020
##                  Baseline_sncf Baseline_sncf_avance
## Ind_sent                 0.000                0.000
## Baseline_git             0.000                0.000
## Baseline_sncf               NA                   NA
## ind_synt_brut            0.000                0.000
## ind_synt_cvs             0.000                0.000
## niv_vie_pas              0.000                0.000
## niv_vie_fut              0.000                0.000
## chom_evol                0.000                0.000
## oppor_achat              0.000                0.000
## epargne_actuelle         0.882                0.882
## sit_fin_pas              0.001                0.001
## sit_fin_fut              0.000                0.000
## cap_fut                  0.223                0.223

Série sans retard :

corrplot(M$r, method = "number")

corrplot(M$r, method = "ellipse")

Séries retardées :

corrplot(M_lag$r, method = "number")

corrplot(M_lag$r, method = "ellipse")

4.3 Etude des corrélations (séries non différenciées)

Je fais la même chose sur les séries non différenciées mais je pense qu’il ne faut pas regarder les résultats

4.3.1 Pearson

M <- rcorr(donnes_calcul, type = "pearson")
M_lag <- rcorr(donnes_calcul, type = "pearson")

Les p-values des corrélation avec notre indicateur de sentiment

table_pval <- cbind(M$P[, "Ind_sent"],
                    M_lag$P[, "Ind_sent"],
                    M$P[, "Baseline_git"],
                    M_lag$P[, "Baseline_git"],
                    M$P[, "Baseline_sncf"],
                    M_lag$P[, "Baseline_sncf"])
colnames(table_pval) <- c("Ind_sent", "Ind_sent_avance",
                          "Baseline_git", "Baseline_git_avance",
                          "Baseline_sncf", "Baseline_sncf_avance")
round(table_pval,3)
##                  Ind_sent Ind_sent_avance Baseline_git Baseline_git_avance
## Ind_sent               NA              NA        0.000               0.000
## Baseline_git        0.000           0.000           NA                  NA
## Baseline_sncf       0.000           0.000        0.000               0.000
## ind_synt_brut       0.035           0.035        0.005               0.005
## ind_synt_cvs        0.026           0.026        0.002               0.002
## niv_vie_pas         0.017           0.017        0.004               0.004
## niv_vie_fut         0.013           0.013        0.001               0.001
## chom_evol           0.317           0.317        0.280               0.280
## oppor_achat         0.170           0.170        0.015               0.015
## epargne_actuelle    0.005           0.005        0.071               0.071
## sit_fin_pas         0.883           0.883        0.112               0.112
## sit_fin_fut         0.006           0.006        0.000               0.000
## cap_fut             0.029           0.029        0.113               0.113
##                  Baseline_sncf Baseline_sncf_avance
## Ind_sent                 0.000                0.000
## Baseline_git             0.000                0.000
## Baseline_sncf               NA                   NA
## ind_synt_brut            0.000                0.000
## ind_synt_cvs             0.000                0.000
## niv_vie_pas              0.000                0.000
## niv_vie_fut              0.000                0.000
## chom_evol                0.000                0.000
## oppor_achat              0.000                0.000
## epargne_actuelle         0.931                0.931
## sit_fin_pas              0.000                0.000
## sit_fin_fut              0.000                0.000
## cap_fut                  0.450                0.450

Série sans retard :

corrplot(M$r, method = "number")

corrplot(M$r, method = "ellipse")

Séries retardées :

corrplot(M_lag$r, method = "number")

corrplot(M_lag$r, method = "ellipse")

4.3.2 Spearman

M <- rcorr(donnes_calcul, type = "spearman")
M_lag <- rcorr(donnes_calcul, type = "spearman")

Les p-values des corrélation avec notre indicateur de sentiment

table_pval <- cbind(M$P[, "Ind_sent"],
                    M_lag$P[, "Ind_sent"],
                    M$P[, "Baseline_git"],
                    M_lag$P[, "Baseline_git"],
                    M$P[, "Baseline_sncf"],
                    M_lag$P[, "Baseline_sncf"])
colnames(table_pval) <- c("Ind_sent", "Ind_sent_avance",
                          "Baseline_git", "Baseline_git_avance",
                          "Baseline_sncf", "Baseline_sncf_avance")
round(table_pval,3)
##                  Ind_sent Ind_sent_avance Baseline_git Baseline_git_avance
## Ind_sent               NA              NA        0.000               0.000
## Baseline_git        0.000           0.000           NA                  NA
## Baseline_sncf       0.000           0.000        0.000               0.000
## ind_synt_brut       0.035           0.035        0.005               0.005
## ind_synt_cvs        0.026           0.026        0.002               0.002
## niv_vie_pas         0.017           0.017        0.004               0.004
## niv_vie_fut         0.013           0.013        0.001               0.001
## chom_evol           0.317           0.317        0.280               0.280
## oppor_achat         0.170           0.170        0.015               0.015
## epargne_actuelle    0.005           0.005        0.071               0.071
## sit_fin_pas         0.883           0.883        0.112               0.112
## sit_fin_fut         0.006           0.006        0.000               0.000
## cap_fut             0.029           0.029        0.113               0.113
##                  Baseline_sncf Baseline_sncf_avance
## Ind_sent                 0.000                0.000
## Baseline_git             0.000                0.000
## Baseline_sncf               NA                   NA
## ind_synt_brut            0.000                0.000
## ind_synt_cvs             0.000                0.000
## niv_vie_pas              0.000                0.000
## niv_vie_fut              0.000                0.000
## chom_evol                0.000                0.000
## oppor_achat              0.000                0.000
## epargne_actuelle         0.931                0.931
## sit_fin_pas              0.000                0.000
## sit_fin_fut              0.000                0.000
## cap_fut                  0.450                0.450

Série sans retard :

corrplot(M$r, method = "number")

corrplot(M$r, method = "ellipse")

Séries retardées :

corrplot(M_lag$r, method = "number")

corrplot(M_lag$r, method = "ellipse")

5 Etude de l’indicateur Camme

Pour essayer de comprendre les évolutions de l’enquête Camme, on peut regarder les contributions de chaque solde à son évolution. C’est pas très lisible mais au cas où :

6 Recherche des événements

J’ai rien trouvé mais j’ai pas tout cherché, j’ai fait une petite recherche des événements. Ma méthodologie : si il y a quelque choses que je pense venir d’un événement, je regarde les tweets, ctrl+F pour voir si je trouve beaucoup d’occurences. Généralement rien. Je n’ai pas mis tous les événements sportifs.

7 Graphique final avec toutes les infos

AQLTools::hc_stocks(donnes_calcul_lag,digits = 2)

Coefficients dans le climat :

##                                                                  Factor1
## Niveau de vie en France - évolution passée                   0.364039156
## Niveau de vie en France - perspectives d'évolution           0.221426936
## Chômage - perspectives d'évolution                          -0.037830549
## Opportunité de faire des achats importants                   0.073239155
## Capacité d'épargne actuelle                                  0.008653029
## Situation financière personnelle - évolution passée          0.201587945
## Situation financière personnelle - perspectives d'évolution  0.153813946
## Capacité d'épargne future                                    0.008911239